use serde::Deserialize;
use config::{Config, Environment, File};
use std::path::PathBuf;
use crate::error::Result;

pub const SYSTEM_PROMPT: &str = r#"你是一个专业的高级程序员，精通C/C++和Rust编程语言。
现在你的任务是将C/C++代码准确转换为Rust代码，
要求：
1. 确保代码可以编译运行
2. 正确处理内存管理
3. 添加必要的pub关键字，不能有main函数或者new方法
4. 代码必须按照c代码转义
5. 使用UTF-8编码
6. 只返回代码，不要任何注释和说明
7. 必须遵循rust代码语法
8. 保持代码的完整性"#;

pub const USER_PROMPT_TEMPLATE: &str = r#"请将以下C/C++代码转换为Rust代码：

{code}"#;

#[derive(Debug, Deserialize, Clone)]
pub struct Settings {
    pub api: ApiSettings,
    pub paths: PathSettings,
    pub conversion: ConversionSettings,
}

#[derive(Debug, Deserialize, Clone)]
pub struct ApiSettings {
    pub key: String,
    pub base_url: String,
    pub timeout: u64,
    pub max_retries: u32,
}

#[derive(Debug, Deserialize, Clone)]
pub struct PathSettings {
    pub input_dir: PathBuf,
    pub output_dir: PathBuf,
    pub test_dir: PathBuf,
}

#[derive(Debug, Deserialize, Clone)]
pub struct ConversionSettings {
    pub max_attempts: u32,
    pub parallel_jobs: u32,
}

impl Settings {
    pub fn new() -> Result<Self> {
        let builder = Config::builder()
            .add_source(File::with_name("./config/default"))
            .add_source(File::with_name("./config/local").required(false))
            .add_source(Environment::with_prefix("APP"));

        Ok(builder.build()?.try_deserialize()?)
    }
} 